package com.kunteng.ynhxksh.utils.rabbit;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class RabbitMQConfig {

    /**
     * 测试类见单元测试目录下RabbitmqTest
     *
     */
    private static final String topicExchangeName = "topic-exchange";
    private static final String fanoutExchange = "fanout-exchange";
    private static final String headersExchange = "headers-exchange";

    private static final String queueName = "cord";

    /**
     * channel.queueDeclare(queue, true, false, false, null);
     第一个参数：队列名字，
     第二个参数：队列是否可持久化即重启后该队列是否依然存在，
     第三个参数：该队列是否时独占的即连接上来时它占用整个网络连接，
     第四个参数：是否自动销毁即当这个队列不再被使用的时候即没有消费者对接上来时自动删除，
     第五个参数：其他参数如TTL（队列存活时间）等。
     * @return
     */
    //声明队列
    @Bean
    public Queue queue() {
        //Queue(String name, boolean durable, boolean exclusive, boolean autoDelete)
        return new Queue("cord", false, true, true);
    }

    /**
     * channel.exchangeDeclare(exchange, "direct", true, false, null);
     第一个参数：交换组名字，
     第二个参数：队交换组类型：三种常用的Exchange（Direct、Fanout、Topic），
     a) 如果是Direct类型，则会将消息中的RoutingKey与该Exchange关联的所有Binding中的BindingKey进行比较，如果相等，则发送到该Binding对应的Queue中；
     b) 如果是  Fanout  类型，则会将消息发送给所有与该  Exchange  定义过  Binding  的所有  Queues  中去，其实是一种广播行为；
     c)如果是Topic类型，则会按照正则表达式，对RoutingKey与BindingKey进行匹配，如果匹配成功，则发送到对应的Queue中；
     * @return
     */
    //声明Topic交换机
    @Bean
    TopicExchange topicExchange() {
        return new TopicExchange(topicExchangeName);
    }

    /**
     *
     channel.queueBind(queue, exchange, routingKey);
     第一个参数：队列名字，
     第二个参数：交换组名称；
     第三个参数，路由key。
     * @param queue
     * @param topicExchange
     * @return
     */
    //将队列与Topic交换机进行绑定，并指定路由键
    @Bean
    Binding topicBinding(Queue queue, TopicExchange topicExchange) {
        return BindingBuilder.bind(queue).to(topicExchange).with("org.cord.#");
    }

    //声明fanout交换机
    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange(fanoutExchange);
    }

    //将队列与fanout交换机进行绑定
    @Bean
    Binding fanoutBinding(Queue queue, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(queue).to(fanoutExchange);
    }

    //声明Headers交换机
    @Bean
    HeadersExchange headersExchange() {
        return new HeadersExchange(headersExchange);
    }

    //将队列与headers交换机进行绑定
    @Bean
    Binding headersBinding(Queue queue, HeadersExchange headersExchange) {
        Map<String, Object> map = new HashMap<>();
        map.put("First", "A");
        map.put("Fourth", "D");
        //whereAny表示部分匹配，whereAll表示全部匹配
        //        return BindingBuilder.bind(queue).to(headersExchange).whereAll(map).match();
        return BindingBuilder.bind(queue).to(headersExchange).whereAny(map).match();
    }
}
